/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package cn.jmicro.api.codec;

/**
 * 
 * @author Yulei Ye
 * @date 2018年11月16日 上午12:20:48
 *
 */
public interface ICodecFactory {

	@SuppressWarnings("rawtypes")
	IDecoder getDecoder(Byte protocol);
	@SuppressWarnings("rawtypes")
	IEncoder getEncoder(Byte protocol);
	
	void registDecoder(Byte protocol,IDecoder<?> decoder);
	
	void registEncoder(Byte protocol,IEncoder<?> encoder);
	
	@SuppressWarnings("unchecked")
	public static <R> R encode(ICodecFactory f,Object obj,Byte protocol){
		return (R)f.getEncoder(protocol).encode(obj);
	}
	
	@SuppressWarnings("unchecked")
	public static <T,R> R decode(ICodecFactory f, T src,Class<R> clazz,Byte protocol){
		return (R)f.getDecoder(protocol).decode(src,clazz);
	}
}
